home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / tools / putstruc.c < prev    next >
Text File  |  1990-07-15  |  1KB  |  71 lines

  1. putstruc(ap, s, b)
  2. char    *ap;        /* structure pointer */
  3. register char    *s;    /* structure format */
  4. register char    *b;    /* sequence of bytes */
  5. {
  6.     register int    i;
  7.     register long    l;
  8.     register char    *p = ap;
  9.     register int    lsb = 1;
  10.     static struct {
  11.         char    a21;
  12.         short    a22;
  13.     } a2;
  14.     static struct {
  15.         char    a41;
  16.         long    a44;
  17.     } a4;
  18.  
  19.     while (i = *s++) {
  20.         switch (i) {
  21.         case '1':
  22.             *b++ = *p++;
  23.             break;
  24.         case '2':
  25.             i = (int) ((char *)&a2.a22 - (char *)&a2) - 1;
  26.             while ((int)(p - ap) & i)
  27.                 p++;
  28.             i = *((short *)p); p += sizeof(short);
  29.             if (lsb) {
  30.                 b[0] = (char)i;
  31.                 i >>= 8;
  32.                 b[1] = (char)i;
  33.             } else {
  34.                 b[1] = (char)i;
  35.                 i >>= 8;
  36.                 b[0] = (char)i;
  37.             }
  38.             b += 2; break;
  39.         case '4':
  40.             i = (int) ((char *)&a4.a44 - (char *)&a4) - 1;
  41.             while ((int)(p - ap) & i)
  42.                 p++;
  43.             l = *((long *)p); p += sizeof(long);
  44.             if (lsb) {
  45.                 b[0] = (char)l;
  46.                 l >>= 8;
  47.                 b[1] = (char)l;
  48.                 l >>= 8;
  49.                 b[2] = (char)l;
  50.                 l >>= 8;
  51.                 b[3] = (char)l;
  52.             } else {
  53.                 b[3] = (char)l;
  54.                 l >>= 8;
  55.                 b[2] = (char)l;
  56.                 l >>= 8;
  57.                 b[1] = (char)l;
  58.                 l >>= 8;
  59.                 b[0] = (char)l;
  60.             }
  61.             b += 4; break;
  62.         case 'L':
  63.             lsb = 1; break;
  64.         case 'M':
  65.             lsb = 0; break;
  66.         default:
  67.             abort();
  68.         }
  69.     }
  70. }
  71.